/**
 * mobx_config.js
 * MobX配置工具模块
 */

// 尝试导入mobx-miniprogram
let mobx;
try {
  // 尝试不同的导入方式
  try {
    // 方式1: 直接导入
    mobx = require('mobx-miniprogram');
  } catch (e1) {
    // 方式2: 尝试使用相对路径从miniprogram_npm导入
    console.warn('直接导入mobx失败，尝试从miniprogram_npm导入:', e1);
    try {
      mobx = require('../../../miniprogram_npm/mobx-miniprogram/index');
    } catch (e2) {
      // 方式3: 尝试从公共配置导入
      console.warn('从miniprogram_npm导入失败，尝试从公共配置导入:', e2);
      try {
        const npmConfig = require('../../oa/config/npm_config');
        mobx = npmConfig.mobx || null;
      } catch (e3) {
        throw new Error('所有导入方式都失败: ' + e1.message + ', ' + e2.message + ', ' + e3.message);
      }
    }
  }

  // 验证mobx对象
  if (!mobx || typeof mobx.action !== 'function') {
    throw new Error('导入的mobx对象无效或不包含action方法');
  }
} catch (error) {
  console.error('导入mobx-miniprogram失败:', error);
  // 提供基本实现
  mobx = {
    observable: function(target) { return target; },
    action: function(fn) { return fn; },
    computed: function(getter) { return getter(); },
    runInAction: function(fn) { return fn(); },
    configure: function() {},
    autorun: function(fn) { fn(); return { dispose: function() {} }; }
  };
}

// MobX配置状态
let isConfigured = false;

/**
 * 配置MobX选项
 * 只执行一次配置，避免重复设置
 */
function configureMobX() {
  // 如果已经配置过，直接返回
  if (isConfigured) {
    return;
  }
  
  try {
    if (mobx && mobx.configure) {
      // 配置MobX，启用严格模式
      mobx.configure({
        enforceActions: 'observed', // 强制通过action修改状态
        computedRequiresReaction: false, // 计算属性不需要reaction
        reactionRequiresObservable: false, // reaction不强制依赖observable
        observableRequiresReaction: false, // observable不强制需要reaction
        disableErrorBoundaries: false // 不禁用错误边界
      });
      
      console.log('MobX配置成功');
      isConfigured = true;
    } else {
      console.warn('无法配置MobX，mobx对象或configure方法不存在');
    }
  } catch (error) {
    console.error('配置MobX时出错:', error);
  }
}

/**
 * 创建安全的MobX action
 * 即使MobX库加载失败也能正常工作
 */
function createSafeAction(fn, name = 'unnamed') {
  try {
    if (typeof mobx.action === 'function') {
      return mobx.action(fn);
    } else {
      console.warn(`创建action失败[${name}]，使用原始函数`);
      return fn;
    }
  } catch (error) {
    console.error(`创建action失败[${name}]，使用原始函数`, error);
    return fn;
  }
}

/**
 * 重置MobX配置状态
 * 主要用于测试环境
 */
function resetConfiguration() {
  isConfigured = false;
}

/**
 * 检查MobX是否已配置
 * @returns {boolean} 配置状态
 */
function isConfigurationComplete() {
  return isConfigured;
}

module.exports = {
  configureMobX,
  resetConfiguration,
  isConfigurationComplete,
  mobx,
  createSafeAction
}; 